package com.dds.system.service.app.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.dds.system.domain.app.AppUserScoreDetail;
import com.dds.system.mapper.app.AppUserScoreDetailMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dds.system.mapper.app.AppUserScoreInfoMapper;
import com.dds.system.domain.app.AppUserScoreInfo;
import com.dds.system.service.app.IAppUserScoreInfoService;

/**
 * 用户积分信息Service业务层处理
 *
 * @author gaolianjie
 * @date 2021-04-09
 */
@Service
public class AppUserScoreInfoServiceImpl implements IAppUserScoreInfoService {
    @Autowired
    private AppUserScoreInfoMapper appUserScoreInfoMapper;

    @Autowired
    private AppUserScoreDetailMapper appUserScoreDetailMapper;

    /**
     * 查询用户积分信息
     *
     * @param userId 用户积分信息ID
     * @return 用户积分信息
     */
    @Override
    public AppUserScoreInfo selectAppUserScoreInfoById(String userId) {
        return appUserScoreInfoMapper.selectAppUserScoreInfoById(userId);
    }

    /**
     * 查询用户积分信息列表
     *
     * @param appUserScoreInfo 用户积分信息
     * @return 用户积分信息
     */
    @Override
    public List<AppUserScoreInfo> selectAppUserScoreInfoList(AppUserScoreInfo appUserScoreInfo) {
        return appUserScoreInfoMapper.selectAppUserScoreInfoList(appUserScoreInfo);
    }

    /**
     * 新增用户积分信息
     *
     * @param appUserScoreInfo 用户积分信息
     * @return 结果
     */
    @Override
    public int insertAppUserScoreInfo(AppUserScoreInfo appUserScoreInfo) {
        return appUserScoreInfoMapper.insertAppUserScoreInfo(appUserScoreInfo);
    }

    /**
     * 修改用户积分信息
     *
     * @param appUserScoreInfo 用户积分信息
     * @return 结果
     */
    @Override
    public int updateAppUserScoreInfo(AppUserScoreInfo appUserScoreInfo) {
        return appUserScoreInfoMapper.updateAppUserScoreInfo(appUserScoreInfo);
    }

    /**
     * 批量删除用户积分信息
     *
     * @param userIds 需要删除的用户积分信息ID
     * @return 结果
     */
    @Override
    public int deleteAppUserScoreInfoByIds(String[] userIds) {
        return appUserScoreInfoMapper.deleteAppUserScoreInfoByIds(userIds);
    }

    /**
     * 删除用户积分信息信息
     *
     * @param userId 用户积分信息ID
     * @return 结果
     */
    @Override
    public int deleteAppUserScoreInfoById(String userId) {
        return appUserScoreInfoMapper.deleteAppUserScoreInfoById(userId);
    }

    /**
     * 修改用户积分
     *
     * @param userId 用户id
     * @param score 积分
     * @param remark 备注
     * @param type 调整类型  1增加 2消减
     */
    @Override
    public void changeScore(String userId, BigDecimal score, String remark, String type) {
        // 查看该用户是否有积分数据
        AppUserScoreInfo appUserScoreInfo = appUserScoreInfoMapper.selectAppUserScoreInfoById(userId);

        if (appUserScoreInfo == null) {
            appUserScoreInfo = AppUserScoreInfo.of().setUserId(userId).setAllScore(BigDecimal.ZERO).setValidScore(BigDecimal.ZERO);
            insertAppUserScoreInfo(appUserScoreInfo);
        }

        // 创建积分调整日志
        AppUserScoreDetail appUserScoreDetail = AppUserScoreDetail.of()
                .setUserId(userId)
                .setChangeType(type)
                .setChangeScene(5)
                .setChangeSceneId("0")
                .setChangeValue(score)
                .setChangeTime(new Date())
                .setRemark(remark);
        appUserScoreDetailMapper.insertAppUserScoreDetail(appUserScoreDetail);

        // 从新调整用户积分
        Map<String, BigDecimal> scoreInfo = appUserScoreDetailMapper.getValidScore(userId);

        appUserScoreInfo.setValidScore(scoreInfo.get("valid")).setAllScore(scoreInfo.get("total"));

        appUserScoreInfoMapper.updateAppUserScoreInfo(appUserScoreInfo);

    }
}
